package com.xique.park.service.command.service;

import com.xique.common.core.web.domain.AjaxResult;
import com.xique.common.core.web.domain.PageResult;
import com.xique.park.bean.domain.*;
import com.xique.park.bean.request.web.garageLaneDev.board.VoiceSetRequest;
import com.xique.park.bean.request.web.garageLaneDev.board.VoiceTestRequest;
import com.xique.park.bean.request.web.garageLaneDev.subdev.DeleteSubDevRequest;
import com.xique.park.bean.request.web.ipc.DevDownAllRequest;
import com.xique.park.bean.request.web.ipc.CommandListRequest;

import java.util.List;

/**
 * 摄像机命令下发service
 *
 * @author xique
 */
public interface IParkIpcCommandService {

    /**
     * 查询设备的在线状态
     *
     * @param sn 设备号
     * @return 设备的在线状态
     */
    String getMainIpcStatus(String sn);

    /**
     * 单个设备初始化
     *
     * @param sn 设备号
     * @return 初始化结果
     */
    AjaxResult devInit(String sn);

    /**
     * 下发副摄像机
     *
     * @param parkId      车场ID
     * @param mainSn      主相机sn
     * @param subIpcList  副摄像机
     * @param reminderMsg 提示消息
     * @return 下发结果
     */
    AjaxResult downSubIpc(Long parkId, String mainSn, List<ParkDeviceNew> subIpcList, String reminderMsg);

    /**
     * 下发副摄像机
     *
     * @param laneId      通道id
     * @param subIpcList  副摄像机
     * @param reminderMsg 提示消息
     * @return 下发结果
     */
    AjaxResult downSubIpc(Long laneId, List<ParkDeviceNew> subIpcList, String reminderMsg);

    /**
     * 删除副摄像机
     *
     * @param mainSn      主相机sn
     * @param request     DeleteSubDevRequest
     * @param reminderMsg 提示消息
     * @return 删除结果
     */
    AjaxResult delSubIpc(String mainSn, DeleteSubDevRequest request, String reminderMsg);

    /**
     * 删除副摄像机
     *
     * @param laneId      通道id
     * @param request     DeleteSubDevRequest
     * @param reminderMsg 提示消息
     * @return 删除结果
     */
    AjaxResult delSubIpc(Long laneId, DeleteSubDevRequest request, String reminderMsg);

    /**
     * 下发附加设备
     *
     * @param parkId      车场ID
     * @param mainSn      主相机sn
     * @param subDevList  副摄像机
     * @param reminderMsg 提示消息
     * @return 下发结果
     */
    AjaxResult downSubDevs(Long parkId, String mainSn, List<ParkDeviceSub> subDevList, String reminderMsg);

    /**
     * 下发附加设备
     *
     * @param laneId      通道id
     * @param subDevList  副摄像机
     * @param reminderMsg 提示消息
     * @return 下发结果
     */
    AjaxResult downSubDevs(Long laneId, List<ParkDeviceSub> subDevList, String reminderMsg);

    /* ---------------------------- 控制板相关命令 ---------------------------- */

    /**
     * 声音参数设置（目前声音参数是配置到通道的）
     *
     * @param laneId      通道id
     * @param request     VoiceSetRequest
     * @param reminderMsg 提示消息
     * @return 声音参数设置结果
     */
    AjaxResult setVoice(Long laneId, VoiceSetRequest request, String reminderMsg);

    /**
     * 音量测试
     *
     * @param laneId  通道id
     * @param request 音量测试请求request
     * @return 音量测试结果
     */
    AjaxResult voiceTest(Long laneId, VoiceTestRequest request);

    /**
     * 音量测试
     *
     * @param mainSn  主相机sn
     * @param request 音量测试请求request
     * @return 音量测试结果
     */
    AjaxResult voiceTest(String mainSn, VoiceTestRequest request);

    /**
     * 显示屏参数设置
     *
     * @param parkId      车场ID
     * @param parkLane    通道对象
     * @param reminderMsg 提示消息
     * @return 显示屏参数设置结果
     */
    AjaxResult setLed(Long parkId, ParkLane parkLane, String reminderMsg);

    /**
     * 下发全部参数
     *
     * @param request DevDownAllRequest
     * @return /
     */
    AjaxResult downAll(DevDownAllRequest request);

    /**
     * 获取命令列表
     *
     * @param request /
     * @return com.xique.common.core.web.domain.AjaxResult
     * @author lxl
     * @date 2021/12/14
     */
    PageResult getCommandInfoList(CommandListRequest request);

    /**
     * 根据 parkId 查询主设备列表
     *
     * @param parkId 车场ID
     * @return 主设备列表
     */
    List<ParkDeviceNew> getMainDevicesByParkId(Long parkId);

    /**
     * 多个设备下载车辆管理类型
     *
     * @param parkId      车场ID
     * @param deviceList  主设备列表
     * @param mngtypeList 车辆管理类型列表
     * @param version     版本号
     * @return /
     */
    AjaxResult downMngType(Long parkId, List<ParkDeviceNew> deviceList, List<ParkCarMngtype> mngtypeList, String version);

    /**
     * 根据cmd更新命令信息
     *
     * @param commandInfo 命令信息
     */
    void updateByCmd(CommandInfo commandInfo);

}
